/*
 * @Author: xiaohao
 * @Date: 2025-10-31 10:20:38
 * @LastEditors: xiaohao
 * @LastEditTime: 2025-11-05 22:11:55
 * @FilePath: /Project/ConcurrentMemoryPool/include/ConcurrentMemoryPool/ThreadCache.h
 * @Description:
 */

#pragma once
#include "Common.h"

class ThreadCache
{
    // 声明 ObjectPool<ThreadCache> 为友元类
    template <class T>
    friend class ObjectPool;

public:
    /// @brief 获取当前线程的ThreadCache实例
    /// @return 当前线程的ThreadCache引用
    static ThreadCache &GetThreadInstance();

    /// @brief 申请内存块
    /// @param size 申请的内存大小（字节）
    /// @return 分配的内存块指针
    void *Allocate(size_t size);

    /// @brief 释放内存块
    /// @param ptr 待释放的内存块指针
    /// @param size 内存块的原始大小（字节）
    void Deallocate(void *ptr, size_t size);

    /// @brief 当线程缓存中对应大小的内存块不足时，从中心缓存获取内存块
    /// @param index 内存块对应的自由链表索引
    /// @param size 对齐后的内存块大小（字节）
    /// @return 从中心缓存获取的内存块指针
    void *FetchFromCentralCache(size_t index, size_t size);

    /// @brief 当某个自由链表过长时，将多余的内存块归还给中心缓存
    /// @param list 过长的自由链表引用
    /// @param size 自由链表对应的内存块大小（字节）
    void ListTooLong(FreeList &list, size_t size);

private:
    // 私有构造函数，确保只能通过GetInstance获取
    ThreadCache() = default;
    ~ThreadCache() = default;

    // 禁止拷贝
    ThreadCache(const ThreadCache &) = delete;
    ThreadCache &operator=(const ThreadCache &) = delete;

private:
    FreeList _freeLists[NFREE_LISTS]; // 自由链表数组，每个元素对应一种大小的内存块
};
